﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ZDSoft.LMS.Core;
using ZDSoft.LMS.Service;
using System.Web.UI;
using ZDSoft.LMS.Web.Apps;
using NHibernate.Criterion;
using ZDSoft.LMS.Domain;
using ZDSoft.LMS.Component;

namespace ZDSoft.LMS.Web.Controllers
{
    public class UserController : UcController
    {
        #region 登录
        [HttpGet]
        public ViewResult Login()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Login(string account, string password)
        {
            password = AppHelper.EncodeMd5(password);//用MD5加密
            //访问数据库，根据用户名和密码获取用户信息
            ZDSoft.LMS.Domain.User loginedUser = Container.Instance.Resolve<IUserService>().Login(account, password);
            if (loginedUser != null)//当用户名和密码正确时
            {
                //保存用户登录信息
                AppHelper.LoginedUser = loginedUser;
                //页面跳转到主页面
                return RedirectToAction("Index", "Home");
                // RedirectToAction("../Home/Index");
                //if (Request["ReturnUrl"] != null)
                //{
                //    return Server.UrlDecode(Request["ReturnUrl"]);
                //}
                //return AppHelper.Host + "Home/Index";//将要跳转的页面路径返回视图
            }
            else
            {
                //如果登录不成功，则向用户提示错误信息
                ViewBag.ErrorMsg = "用户名或密码错误。";
                return View();
            }
            // return "0";//代表用户户或密码错误
        }
        #endregion

        /// <summary>
        /// 分页展示user信息,默认为第一页
        /// </summary>
        /// <param name="pageIndex">页码</param>
        /// <param name="userName">查询条件，用户名</param>
        public ActionResult Index(int pageIndex = 1, string userName = "")
        {
            int count = 0;//用于存放满足条件的记录总数
            IList<ICriterion> listQuery = GetCondition(userName);//获取查询条件

            IList<Order> listOrder = new List<Order>() { new Order("ID", true) };//设置一个排序集合，new Order("ID", true)表示：根据ID排序,true代表升序,false代表降序

            IList<Domain.User> list = Container.Instance.Resolve<IUserService>().GetPaged(listQuery, listOrder, pageIndex, PagerHelper.PageSize, out count);

            //将list对象存放到PageList对象中,同时将分页的相关属性也包含在其中
            PageList<Domain.User> pageList = list.ToPageList<Domain.User>(pageIndex, PagerHelper.PageSize, count);//转换为PageList集合，用于分页控件显示不同的页码
         
            return View(pageList);//用pageList集合填充页面。
        }

        private IList<ICriterion> GetCondition(string userName = "")//生成查询条件,userName变量默认为空
        {
            List<ICriterion> queryConditions = new List<ICriterion>();//实例化一个查询条件集合

            if (!string.IsNullOrEmpty(userName))//如果userName变量不为空
            {
                queryConditions.Add(new LikeExpression("UserName", userName));//在查询条件集合中加入一个模糊查询条件
            }
            return queryConditions;//返回查询条件集合
        }

        public ActionResult Create()//这个方法用于mvc展示页面
        {
            Domain.User user = new Domain.User();//实体化一个空的实体

            ////取出系统中的所有角色
            //IList<Role> roles = Container.Instance.Resolve<IRoleService>().GetAll();
            ////通过ViewBag传递到视图中去
            //ViewBag.Roles = roles;

            //将以上角色的获取方法写的方法，用于多处调用
            SetRoles();

            return View(user);//用一个视图展示user
        }

        /// <summary>
        /// 提交创建用户
        /// 说明：获取表单值的方法：
        /// 1：获取Model对象，将Model对象作为参数，可获取对象中的所有值
        /// 2：获取指定控件的值，将控件名称（控件的name属性）作为参数，可获取该控件的值
        /// </summary>
        /// <param name="user">提交的用户对象</param>
        /// <param name="hdSelectedIds">提交的角色ID串，每个角色ID中间用“,”隔开</param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Create(Domain.User user, string hdSelectedIds)//这个方法用于mvc创建user
        {
            user.Password = Container.Instance.Resolve<ISystemSettingService>().GetDefaultPassword();//获取系统默认的用户密码
            if (ModelState.IsValid)//如果user实体的数据合法
            {
                //判断是否存在
                if (Container.Instance.Resolve<IUserService>().AccountCheck(0, user.Account))
                {
                    ModelState.AddModelError("Account", "帐号已存在");//返回提示信息
                    SetRoles();//提供角色供视图显示
                    return View(user);//停留在原页面,返回User对象，目的是保留提交前输入的用户信息
                }

                Container.Instance.Resolve<IUserService>().Create(user, hdSelectedIds.Replace(",,", ","));//创建user实体
                return RedirectToAction("Index");//跳转到Index页面
            }

            SetRoles();//提供角色供视图显示
            return View(user);//停留在原页面,返回User对象，目的是保留提交前输入的用户信息
        }

        public ActionResult Edit(int id)//当调用edit页面时将传入一个id,这个id代表要修改的哪一行数据
        {
            Domain.User user = Container.Instance.Resolve<IUserService>().Get(id);//根据id获取user实体
            return View(user);//将这个user实体显示在edit页面上对应的控件
        }

        /// <summary>
        /// 编辑用户
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Edit(Domain.User user)//当用户点击“保存”按钮时要执行的方法
        {
            if (ModelState.IsValid)//如果实体的数据合法
            {
                Container.Instance.Resolve<IUserService>().Update(user);//更新实体
                return RedirectToAction("Index");//跳转到列表页面
            }
            return View(user);//停留在原页面
        }

        /// <summary>
        /// 查看明细
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ViewResult Details(int id)//当调用edit页面时将传入一个id,这个id代表要显示的哪一行数据
        {
            Domain.User user = Container.Instance.Resolve<IUserService>().Get(id);//根据id获取user实体
            return View(user);//将这个user实体显示在details页面上对应的控件
        }

        /// <summary>
        /// 状态变更
        /// </summary>
        /// <param name="id">用户ID</param>
        /// <returns></returns>
        public ActionResult SwitchStatus(int id)
        {
            Container.Instance.Resolve<IUserService>().SwitchStatus(id);//调用业务逻辑层方法，切换用户状态
            return RedirectToAction("Index");//跳转到列表页面
        }


        /// <summary>
        /// 配置用户对应的橘色
        /// </summary>
        /// <param name="id">用户ID</param>
        /// <returns></returns>
        [HttpGet]
        public ViewResult AssignRole(int id)
        {
            User user = Container.Instance.Resolve<IUserService>().Get(id);
            
            //获取所有的并且是启用状态的角色
            //说明：执行本操作前，请先在domain层定义扩展属性IsChecked，用于视图状态的显示
            IList<Role> roles = Container.Instance.Resolve<IRoleService>().GetAll().Where(m => m.IsActive == true).ToList();
            //判断列表中的角色是否是用户对应的角色
            if (user.Roles != null)
            {
                /*
                foreach (var item in roles)
                {
                    //如果当前角色存在于用户的角色中，则设置为选中状态
                    if (user.Roles.Contains(item))
                        item.IsChecked = true;
                }
                */

                foreach (var item in roles)
                {
                    if (user.Roles.Where(m => m.ID == item.ID).Count() > 0)
                        item.IsChecked = true;
                }
            }

            ViewBag.Roles = roles;

            return View(user);
        }

        /// <summary>
        /// 配置角色
        /// </summary>
        /// <param name="id">用户ID，此处的id为post提交的action中的 user/AssignRole/id值，此参数可以与userid中选择一个即可</param>
        /// <param name="userId">用户ID，（推荐使用本参数，目的是教学中方便学生理解）</param>
        /// <param name="hdSelectedIds">用,分开的角色ID</param>
        /// <returns></returns>
        [HttpPost]
        //public ActionResult AssignRole(int id,int userId, string hdSelectedIds)
        public ActionResult AssignRole(int userId, string hdSelectedIds)
        {
            Container.Instance.Resolve<IUserService>().AssignRole(userId, hdSelectedIds.Replace(",,",","));
            return RedirectToAction("Index");//跳转到列表页面
        }

        /// <summary>
        /// 修改密码
        /// </summary>
        /// <returns></returns>
        public ActionResult ChangePassword()
        {
            return View();
        }


        public ViewResult UnAuthorized()
        {
            return View();
        }

        #region 扩展方法
        /// <summary>
        /// 设置角色
        /// </summary>
        private void SetRoles()
        {
            //取出系统中的所有角色
            IList<Role> roles = Container.Instance.Resolve<IRoleService>().GetAll().Where(m=>m.IsActive == true).ToList();
            //通过ViewBag传递到视图中去
            ViewBag.Roles = roles;
        }
        #endregion

    }
}
